﻿/**
 * javascript sculove.js - 프로젝트 전반에 걸쳐 전 시스템에서 공통으로 사용하는 함수와 object를 기술한
 * 자바스크립트 파일이다. <br><br>
 * @name sculove.js
 * @overview 
 * @author 손찬욱
 * @version 1.0
 */
var sculove = {
	version : "1.0",
	
	/*
	 * 공통 상수값 설정
	 */
	Const : {
		COM_AJAX_HEADER : "DataHeader-Type",
		COM_AJAX_HEADER_VALUE : "ajax",
		COM_COMCD_SELECT : "==선택==",
		COM_COMCD_ALL : "==전체==",
		COM_COMCD_SEPERATOR : ":",
		COM_COMCD_URL : "/zzz.inqComCd.htm"
	},
 
	/*
	 * 화면 open시 처리
	 */
	init : function() {
		$.ajaxSetup({
			type : "POST",
			timeout : 60000,
			beforeSend : function(XMLHttpRequest) {
			 	XMLHttpRequest.setRequestHeader(sculove.Const.COM_AJAX_HEADER, sculove.Const.COM_AJAX_HEADER_VALUE);
			}, 
			error : function(XMLHttpRequest, textStatus, errorThrown) {
				// typically only one of textStatus or errorThrown 
				// will have info
				alert("ERROR CODE : " + XMLHttpRequest.status + ", textStatus : " + textStatus + ", this : " + this + ", errorThrown : " + errorThrown);
				//this; // the options for this ajax request
			}
		});
		
		// validataion 초기화 설정
		sculove.initValidate();
		
		// Mask 초기화 설정
		sculove.initMaskedInput();
		
		// comCd 초기화 설정
		//sculove.Combo.init();
	},
	
	/*
	 * validataion 초기화
	 */
	initValidate : function() {
		// jQuery Validataion Message 초기설정
		jQuery.extend(jQuery.validator.messages, {
			required: "필수 입력 항목입니다.",
			email: "유효한 이메일 주소가 아닙니다.",
			date: "유효한 날짜가 아닙니다.",
			number: "숫자만을 입력하십시오.",
			maxlength: $.validator.format("{0}자 이하로 입력하십시오."),
			minlength: $.validator.format("{0}자 이상으로 입력하십시오"),
			
			
			url: "유효한 URL이 아닙니다.",
			dateISO: "Please enter a valid date (ISO).",
			dateDE: "Bitte geben Sie ein gültiges Datum ein.",
			numberDE: "Bitte geben Sie eine Nummer ein.",
			digits: "(0~9)키만 입력 가능합니다.",
			creditcard: "유효한 신용카드가 아닙니다.",
			equalTo: "Please enter the same value again.",
			accept: "Please enter a value with a valid extension.",
			rangelength: $.validator.format("Please enter a value between {0} and {1} characters long."),
			range: $.validator.format("Please enter a value between {0} and {1}."),
			max: $.validator.format("Please enter a value less than or equal to {0}."),
			remote: "Please fix this field.",
			min: $.validator.format("Please enter a value greater than or equal to {0}.")
		});
		jQuery.validator.success = "valid";
	},
	
	
	/*
	 * masked input 초기화
	 */
	initMaskedInput : function() {
		// 날자 정의 추가
		//$.mask.definitions['mm']='1,2,3,4,5,6,7,8,9,10,11,12';
	},
	
	/*
	 * 공통코드 객체
	 *  1) 비동기식호출
	 *  2) 서버 캐싱. 가능하다면 화면도 캐싱
	 *  3) 전체/선택추가
	 *  4) 코드값으로 선택, index로 선택
	 *  5) 상위콤보 처리 (멀티콤보)
	 *  6) 비동기식 호출 완료후, 응용 코드 호출 <OnComboComplete이벤트 binding 필요>
	 *
	 * [공통코드 사용법]
	 * - id : comCd가 존재하는 select element
	 * - comCd : 코드[required] (하위코드인 경우. :로 구분)
	 * - index : 선택되어지는 순번 (1부터시작. $붙은 경우는 코드와 일치한값을 선택)
	 * - header : 선택(S), 전체(A)
	 * 
	 * 예) 
	 * <select id="combo1" comCd="IT001" index="2" header="S">		<!--순번-->
	 * </select> 
	 * 
	 * <select id="combo2" comCd="IT002" index="$1001" header="A"> 	<!--코드-->
	 * </select>
	 * <select id="combo3" comCd="ZZ070:004" index="3" header="S">
	 * </select>
	*/ 
	ComCd : {
		/*
		init : function() {
			// 공통콤보 처리
			var comboData = new Array();
			$("select[comCd]").each(function() {
				comboData.push("comCd=" + $(this).attr("comCd")); 
			});
			
			if(comboData.length > 0) { 		// 콤보가 존재할 경우
				// reqeust tocken 추가
				comboData.push($('#form_frameworkTokenForm').serialize());

				// ajax 요청	 
				$.ajax({
					url : sculove.Const.COM_COMCD_URL,
					data : comboData.rmvDuplicates().join("&"),
					success : function(data) {
						var resultObj= eval('(' + data + ')');
						$("select[comCd]").each(function() {	// 각각의 combo 처리
							sculove.ComCd.setCombo($(this), resultObj);
						});
					}
				});
			}		
		},
		*/
		 
		/*
		 * 단일 콤보 호출
		 * @param cbId : 콤보객체
		 * @param comCd : 공통코드
		 * @param header : 전체, 선택 여부 (A,S)
		 * @param index : 선택 index. 1부터 시작 ($붙은 경우는 코드와 일치한값을 선택)
		 */
		send : function(cbId, comCd, header, index) {
		 	if (sculove.isEmpty(comCd)) {
//				alert("[" + target.attr("comCd") + "] 요청한 데이터가 존재하지 않거나, comCd가 존재하지 않습니다");
				return;
			}	
			
			$.ajax({
				url : sculove.Const.COM_COMCD_URL,
				data : "comCd=" + comCd, 
				success : function(data) {
					var resultObj= eval('(' + data + ')');
					$("#" + cbId).attr("comCd", comCd);
					$("#" + cbId).attr("header", header);
					$("#" + cbId).attr("index", index);
					sculove.ComCd.setCombo($("#" + cbId), resultObj);
				}
			});			
		},
		
		/*
		 * 자식 콤보 호출
		 * @param cbId : 콤보객체
		 * @param childCbId : 자식콤보
		 * @param header : 전체, 선택 여부 (A,S)
		 * @param index : 선택 index. 1부터 시작 ($붙은 경우는 코드와 일치한값을 선택)
		 */
		sendChild : function(cbId, childCbId, header, index) {
			 // 전체, 선택인 경우에는 서버로 요청하지 않음
			 if( $("#" + cbId).children(":selected").text() == sculove.Const.COM_COMCD_ALL 
				|| $("#" + cbId).children(":selected").text() == sculove.Const.COM_COMCD_SELECT) {
				sculove.ComCd.resetComCd($("#" + childCbId), header);
				return;
			 }
			 sculove.ComCd.send(
				childCbId 
				, $("#" + cbId).attr("comCd") + sculove.Const.COM_COMCD_SEPERATOR + $("#" + cbId).children(":selected").attr("value")
				, header
				, index
			);
		},
		
		/*
		 * ComCd 초기화
		 */
		resetComCd : function(target, header) { 
			/////////////////////////////////////
			// 1. 기존 노드 삭제
			/////////////////////////////////////
			target.children().remove();
			
			/////////////////////////////////////
			// 2. 전체(A),선택(S) 추가 [header]
			/////////////////////////////////////
			if(header == "S") {	// 선택
				target.append("<OPTION value=''>" + sculove.Const.COM_COMCD_SELECT + "</OPTION>");															
			} else if (header == "A") {	// 전체
				target.append("<OPTION value='A'>" + sculove.Const.COM_COMCD_ALL + "</OPTION>");						
			} 					
		},
		
		/*
		 * 콤보파일 설정
		 * 
		 * @param target : jQuery 객체 (콤보객체)
		 * @param resultObj : 서버에서 받은 JSON형태 콤보데이터
		 */
		setCombo : function(target, resultObj) {
			/////////////////////////////////////
			// 1. reset ComCd
			/////////////////////////////////////
			sculove.ComCd.resetComCd(target, target.attr("header"));
			
			/////////////////////////////////////
			// 2. ComCd 내용 설정 [comCd] 내용
			/////////////////////////////////////					
			for(var idx=0; idx < resultObj[target.attr("comCd")].length; idx++) {
				var comCdObj = resultObj[target.attr("comCd")][idx];
				target.append("<OPTION value='" + comCdObj.cd + "'>" + comCdObj.cdNm + "</OPTION>");
			}
			
			/*
			 * 3. 선택 [index]
			 *  - 1부터 index
			 *  - $로 시작되는 것은 cd값으로 선택 
			 */
			var index = target.attr("index");
			if(!sculove.isEmpty(index)) {
				if(index.indexOf("$") == -1 ) { // 순번으로 선택
					target.children(":eq(" + index + ")").attr("selected","selected");
				} else {	// cd값으로 선택
					index = index.remove("$");
					target.children("[value=" + index + "]").attr("selected","selected");
				}
			}
			// 선택된 대상의 OnChange 이벤트 발생
			target.change();
			
			/*
			 * 4. ComCd처리완료 후, 사용자 이벤트 제공
			 * OnComboComplete 함수 호출
			 *
			 * 사용예)
			 * 
			 * $("#combo5").bind("OnComboComplete", function() {
			 *		alert("OnComboComplete!");
			 *	});
			 */
			target.trigger("OnComboComplete"); 
		}
	},
	
	/*
	 * 널값 여부 확인
	 * 
	 * @param obj : 검사할 대상
	 */	
	isEmpty : function(obj) {
		var tmpObj = obj || "";
		if(typeof(tmpObj) == "object" ) {
			if(tmpObj.length == 0) return true;
			else return false;
		}
		return tmpObj.isEmpty();
	}
};

// 초기 공통 script 호출
$(document).ready( function() {
	sculove.init();
});
